#include <iostream>
#include <vector>
#include <functional>
#include <unistd.h>
#include <pthread.h>
#include "BlockQueue.hpp"
// #include "Task.hpp"

using namespace BlockQueueMoudel;
// using namespace TaskMoudle;

using task_t = std::function<void()>;

std::vector<task_t> tasks;
void Sql() { std::cout << "我是一个数据库任务" << std::endl; }
void UpLoad() { std::cout << "我是一个上传任务" << std::endl; }
void DownLoad() { std::cout << "我是一个下载任务" << std::endl; }

// 生产者
void *Producer(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);
    int cnt = 0;
    while (true)
    {
        // sleep(2);

        // 1.从tasks数组中获取任务
        bq->Push(tasks[cnt % 3]);
        cnt++;

        // 2.生产任务
        std::cout << "producer 生产了一个任务" << std::endl;
    }
}

// 消费者
void *Consumer(void *args)
{
    BlockQueue<task_t> *bq = static_cast<BlockQueue<task_t> *>(args);
    while (true)
    {
        sleep(2);

        // 1.从bq队列中获取任务
        task_t t;
        bq->Pop(&t);

        // 2.处理任务
        t();
        std::cout << "consumer 处理完成一个任务" << std::endl;
    } 
}

int main()
{
    tasks.push_back(Sql);
    tasks.push_back(UpLoad);
    tasks.push_back(DownLoad);

    BlockQueue<task_t> *bq = new BlockQueue<task_t>(5);

    // 单生产者、单消费者
    pthread_t p, c;
    pthread_create(&p, nullptr, Producer, bq);
    pthread_create(&c, nullptr, Consumer, bq);

    pthread_join(p, nullptr);
    pthread_join(c, nullptr);

    delete bq;

    return 0;
}

// int main2()
// {
//     srand(time(nullptr) | getpid());

//     BlockQueue<Task> *bq = new BlockQueue<Task>(5);

//     // 单生产者、单消费者
//     pthread_t p, c;
//     pthread_create(&p, nullptr, Producer, bq);
//     pthread_create(&c, nullptr, Consumer, bq);

//     pthread_join(p, nullptr);
//     pthread_join(c, nullptr);

//     delete bq;

//     return 0;
// }

// int main1()
// {
//     BlockQueue<int> *bq = new BlockQueue<int>(5);

//     // 单生产者、单消费者
//     pthread_t p, c;
//     pthread_create(&p, nullptr, Producer, bq);
//     pthread_create(&c, nullptr, Consumer, bq);

//     pthread_join(p, nullptr);
//     pthread_join(c, nullptr);

//     // 多生产者、多消费者
//     // pthread_t p1, p2, p3, c1, c2;
//     // pthread_create(&p1, nullptr, Producer, bq);
//     // pthread_create(&p2, nullptr, Producer, bq);
//     // pthread_create(&p3, nullptr, Producer, bq);
//     // pthread_create(&c1, nullptr, Consumer, bq);
//     // pthread_create(&c2, nullptr, Consumer, bq);

//     // pthread_join(p1, nullptr);
//     // pthread_join(p2, nullptr);
//     // pthread_join(p3, nullptr);
//     // pthread_join(c1, nullptr);
//     // pthread_join(c2, nullptr);

//     delete bq;

//     return 0;
// }